package com.szq.lottery.domain.strategy.service.alogorithm.impl;

import com.szq.lottery.domain.strategy.service.alogorithm.BaseAlgorithm;
import com.szq.lottery.domain.strategy.model.vo.AwardRateInfo;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;

/**
 * - 首先要从总的中奖列表中排除掉哪些被排除掉的奖品，这些奖品涉及到的概率的值重新计算
 * - 如果排除后剩余的奖品列表小于等于1，则可以直接返回对应的信息
 * - 接下来就使用随机数工具生产一个100内的随机值与奖品列表中的值进行循环比对
 * @author 吾空白
 */
@Component("entiretyRateRandomDrawAlgorithm")
public class EntiretyRateRandomDrawAlgorithm extends BaseAlgorithm {

    @Override
    public String randomDraw(Long strategyId, List<String> excludeAwardIds) {
        /**
         * BigDecimal.ZERO 表示一个数值为 0 的 BigDecimal 实例，可以用于初始化变量、比较、运算等操作。例如，可以通过以下方式创建一个值为 0 的 BigDecimal 对象：
         */
        BigDecimal differenceDenominator = BigDecimal.ZERO;

        //排除掉不在抽奖范围的奖品ID集合
        /**
         *  奖品ID
         *   private  String awardId;
         *
         *  中将概率
         *   private BigDecimal awardRate;
         */
        List<AwardRateInfo> differenceAwardRateList = new ArrayList<>();
        List<AwardRateInfo> awardRateIntervalValList=awardRateInfoMap.get(strategyId);
        for (AwardRateInfo awardRateInfo:awardRateIntervalValList){
            String awardId = awardRateInfo.getAwardId();
            if (excludeAwardIds.contains(awardId)){
                continue;
            }
            //排除掉不在抽奖范围的奖品ID集合
            differenceAwardRateList.add(awardRateInfo);
            //概率相加
            differenceDenominator = differenceDenominator.add(awardRateInfo.getAwardRate());
        }
        if(differenceAwardRateList.size()==0) {
            return null;
        }
        if(differenceAwardRateList.size()==1) {
            return differenceAwardRateList.get(0).getAwardId();
        }

        //获取随机概率值
        SecureRandom secureRandom = new SecureRandom();
        int ramdomVal = secureRandom.nextInt(100)+1;

        //循环获取奖品
        String awardId="";
        int cursorVal=0;
        for (AwardRateInfo awardRateInfo:differenceAwardRateList){
            int rateVal = awardRateInfo.getAwardRate().divide(differenceDenominator, 2, BigDecimal.ROUND_UP)
                    .multiply(new BigDecimal(100)).intValue();
            if(ramdomVal<=(cursorVal+rateVal)){
                awardId=awardRateInfo.getAwardId();
                break;
            }
            cursorVal+=rateVal;
        }

        //返回中将结果
        return awardId;
    }
}
